<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  
  <title>Activity的进阶 | 清风向阳</title>
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  
    <meta name="keywords" content="Joker,Joker's Blog" />
  
  <meta name="description" content="Activity的生命周期变化有两种情况，一个是人为，一个是系统干预。">
<meta name="keywords" content="Activity">
<meta property="og:type" content="article">
<meta property="og:title" content="Activity的进阶">
<meta property="og:url" content="http://mjjde.github.io/2015/12/28/Activity的进阶/index.html">
<meta property="og:site_name" content="清风向阳">
<meta property="og:description" content="Activity的生命周期变化有两种情况，一个是人为，一个是系统干预。">
<meta property="og:image" content="http://jokero1o.github.io/images/blog_activity.jpg">
<meta property="og:updated_time" content="2017-09-15T07:00:09.000Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Activity的进阶">
<meta name="twitter:description" content="Activity的生命周期变化有两种情况，一个是人为，一个是系统干预。">
<meta name="twitter:image" content="http://jokero1o.github.io/images/blog_activity.jpg">
  
  
    <link rel="icon" href="/favicon_pic.ico">
  
  <link href="//cdn.bootcss.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" type="text/css">
  <link rel="stylesheet" href="/css/style.css">
  <script src="/js/pace.min.js"></script>
  

  
  

</head>

<body>
  <div id="container">
      <header id="header">
    <div id="banner"></div>
    <div id="header-outer">
        <div id="header-menu" class="header-menu-pos animated">
            <div class="header-menu-container">
                <a href="/" class="left">
                    <span class="site-title">Joker&#39;s Blog</span>
                </a>
                <nav id="header-menu-nav" class="right">
                    
                    <a  href="/">
                        <i class="fa fa-home"></i>
                        <span>Home</span>
                    </a>
                    
                    <a  href="/archives">
                        <i class="fa fa-archive"></i>
                        <span>Archives</span>
                    </a>
                    
                    <a  href="/about">
                        <i class="fa fa-user"></i>
                        <span>About</span>
                    </a>
                    
                </nav>
                <a class="mobile-header-menu-button">
                    <i class="fa fa-bars"></i>
                </a>
            </div>
        </div>
        <div id="header-row">
            <div id="logo">
                <a href="/">
                    <img src="/images/avatar.jpg" alt="logo">
                </a>
            </div>
            <div class="header-info">
                <div id="header-title">
                    
                    <h2>
                        Joker&#39;s Blog
                    </h2>
                    
                </div>
                <div id="header-description">
                    
                    <h3>
                        一个认真的技术博客
                    </h3>
                    
                </div>
            </div>
            <nav class="header-nav">
                <div class="social">
                    
                        <a title="Joker"  href="//joker-studio.pub">
                            <i class="fa fa-home fa-2x"></i></a>
                    
                        <a title="Github" target="_blank" href="//github.com/mjjde">
                            <i class="fa fa-github fa-2x"></i></a>
                    
                </div>
            </nav>
        </div>
    </div>
</header>
      <div class="outer">
        <section id="main" class="body-wrap"><article id="post-Activity的进阶" class="article article-type-post" itemscope itemprop="blogPost">
  <div class="article-inner">
    
      <header class="article-header">
        
  
    <h1 class="post-title" itemprop="name">
      Activity的进阶
    </h1>
    <div class="post-title-bar">
      <ul>
          
              <li>
                  <i class="fa fa-book"></i>
                  
                      <a href="/categories/Android技术/">Android技术</a>
                  
              </li>
          
        <li>
          <i class="fa fa-calendar"></i>  2015-12-28
        </li>
        <li>
          <i class="fa fa-eye"></i>
          <span id="busuanzi_value_page_pv"></span>
        </li>
      </ul>
    </div>
  

          
      </header>
    
    <div class="article-entry post-content" itemprop="articleBody">
      
            
            <blockquote>
<p>Activity的生命周期变化有两种情况，一个是人为，一个是系统干预。<br><a id="more"></a><br><img src="http://jokero1o.github.io/images/blog_activity.jpg" alt=""></p>
</blockquote>
<h4 id="正常Activity生命周期"><a href="#正常Activity生命周期" class="headerlink" title="正常Activity生命周期"></a><a href="#u6B63_u5E38Activity_u751F_u547D_u5468_u671F" title="正常Activity生命周期"></a>正常Activity生命周期</h4><p>对于正常的Activity我们应该很熟悉了。一个Activity从一个不可见状态再变为可见状态有多一个onRestart()回调,接着就进行常规的顺序调用生命周期函数。onStart&gt;onResume,上面说的不可见状态是指在后台。按Home键后，调用周期函数为：onPause&gt;onStop,但是如果是一个透明的Activity，onStop不会被调用。</p>
<p>Activity的周期函数直接有对应关系。onResume和onPause是针对可见性的一组调用，onStart和onStop是针对前后台的一组回调。</p>
<p>当一个Activity A启动Activity B时，A的生命周期会先调用onPause,在去调用B的onCreate&gt;onStart&gt;onResume,等到B展现在前台后，再回去调用A的onStop函数。</p>
<h4 id="非正常Activity生命周期"><a href="#非正常Activity生命周期" class="headerlink" title="非正常Activity生命周期"></a><a href="#u975E_u6B63_u5E38Activity_u751F_u547D_u5468_u671F" title="非正常Activity生命周期"></a>非正常Activity生命周期</h4><p>非正常Activity的生命周期是指系统未经过我们意愿而对Activity的采取的行为。比如系统资源紧张而杀死后台Activity，或者是屏幕切换是的Activity的销毁和创建。</p>
<p>在系统没经过我们同意就去杀死我们Activity，那么也会给我们些补偿措施。onSaveInstanceState()方法会在系统结束Activity时调用的方法，这个方法只会在Activity异常退出时才会调用，执行在onStop之前，与onPause没有时序关系，可前可后。在我们开启一个被系统强制关闭的Activity是，系统会调用onRstoryInstanceState(),在onStart后调用。</p>
<p>这种补偿措施可以保持之前Activity的数据或状态，当我们再次开启时，可以给我们提供还原的场景和机会。</p>
<p>对于系统在Kill Activity时是按照优先级来处理的。前台 &gt; 可见非前台 &gt; 后台。优先kill低的。</p>
<p>对于系统屏幕切换造成的Activity的销毁和重建，我们可以加以控制的。通过配置Activity的android:configChanges我们可以监听感兴趣的属性变化。然后我们在Activity中重写回调函数onConfigurationChanged().这时候系统不会销毁Activity，而是调用该回调方法。</p>
<p>注意的是在4.2后系统默认不会处理screenSize的属性变化了。所以在监听的时候要加上这个属性变化的监听，不然是不会调用onConfigurationChanged()方法的。</p>
<h4 id="Activity的启动模式"><a href="#Activity的启动模式" class="headerlink" title="Activity的启动模式"></a><a href="#Activity_u7684_u542F_u52A8_u6A21_u5F0F" title="Activity的启动模式"></a>Activity的启动模式</h4><p>我们的Activity都是有所属Task去管理的。启动一个Activity一般会将实例加入Task栈,当销毁时，会出Task栈。Task默认的名字为我么项目的包名，当要启动一个Activity的时候也会默认放入当前context所在的Task,这个就是为什么在使用ApplicationContext或在Service里面启动一个Activity的时候需要加入Flag，这是因为ApplicationContext和Service是没有Task栈的。一个App可以有多个栈，一个栈可以有多个App的Activity.</p>
<p>我们可以在Maninfest中配置Activity的Task。</p>
<h5 id="standard模式"><a href="#standard模式" class="headerlink" title="standard模式"></a><a href="#standard_u6A21_u5F0F" title="standard模式"></a>standard模式</h5><p>这也是Activity的默认模式，在这种模式下，Activity会新创建一个实例放入当前的Task栈内，没有多余的操作，不管当前Task内存放了怎样的Activity，怎样的顺序，系统都会new 一个实例。</p>
<h5 id="singleTop模式"><a href="#singleTop模式" class="headerlink" title="singleTop模式"></a><a href="#singleTop_u6A21_u5F0F" title="singleTop模式"></a>singleTop模式</h5><p>这种模式会对一个栈内的Activity顺序和个数都没有影响，影响的是设置该模式的Activity，如果启动的Activity在栈内已经有实例了，并且该实例在栈顶，那么就不会重新new Activity，而是使用栈顶的Activity，生命周期也会不会调用onCreate，既然都不是新创建的肯定不会走onCreate回调了，这很好理解。那么就会调用onNewIntent回调。</p>
<p>比如栈内有Activity A B C D,这时候D要启动A,因为栈顶是D所以会按照正常的new A放入Task内，如果D再启动D，栈顶已经是D的实例了，那么就不会new,而是复用改实例，并调用回调函数onNewIntent。</p>
<h5 id="singleTask模式"><a href="#singleTask模式" class="headerlink" title="singleTask模式"></a><a href="#singleTask_u6A21_u5F0F" title="singleTask模式"></a>singleTask模式</h5><p>这种模式会对一个栈内的Activity顺序和个数都有影响。看名字我们就知道在一个Task只允许存在一个实例。很霸道模式，如果一个Task内存在了该Activity的实例，那么Task会将它上面的所有的Activity全部弹出，并且不会调用onCreate而是调用onNewIntent。</p>
<p>比如栈内有Activity A B C D，这时候D要启动A，因为Task已经存在实例A了，那么BCD将会被弹出栈，最后Task里面只剩下A.</p>
<p>这种模式必须配合android:taskAffinity使用，这个配合使用会，被标记的Activity将会作用在指定的Task内，上面没有说是因为android:taskAffinity默认的是项目的包名，也就是在正常启动Activity的Task内，如果要指定作用Task,就必须显示的使用android:taskAffinity。Task名必须要有.。</p>
<h5 id="singleInstance模式"><a href="#singleInstance模式" class="headerlink" title="singleInstance模式"></a><a href="#singleInstance_u6A21_u5F0F" title="singleInstance模式"></a>singleInstance模式</h5><p>很霸道的模式，不管当前的Task是怎样的顺序，都会新建一个Task,并存放将要启动的activity，如果指定了android:taskAffinity，那么就会会命名新Task的名字，不然新建的名字依然是包名，这样就会出现两个相同名字的Task,但是id不一样，所以id才是Task唯一标示。如果在标记singleInstance的Activity在开启一个Activity，那么这么Activity又会回到原来的Task内，而不是和它在一起，如果我们启动一个singleTask，android:taskAffinity和用singleInstance Activity的android:taskAffinity标记一样的Task的Activity，那么这两个Activity依然不在同个Task里，即使这两个Task同名，而id却不同。</p>
<h4 id="Activity的Flags"><a href="#Activity的Flags" class="headerlink" title="Activity的Flags"></a><a href="#Activity_u7684Flags" title="Activity的Flags"></a>Activity的Flags</h4><p>(1)Intent.FLAG_ACTIVITY_NEW_TASK：使用一个新的task来启动Activity，一般用在service中启动Activity的场景，因为service中并不存在Activity栈。<br>(2)Intent.FLAG_ACTIVITY_SINGLE_TOP：类似andoid:launchMode=”singleTop”<br>(3)Intent.FLAG_ACTIVITY_CLEAR_TOP：类似andoid:launchMode=”singleTask”<br>(4)Intent.FLAG_ACTIVITY_NO_HISTORY：使用这种模式启动Activity，当该Activity启动其他Activity后，该Activity就消失了，不会保留在task栈中。例如A B，在B中以这种模式启动C，C再启动D，则当前的task栈变成A B D。</p>

            <div class="post-copyright">
    <div class="content">
        <p>最后更新： 2017年09月15日 15:00</p>
        <p>原始链接： <a class="post-url" href="/2015/12/28/Activity的进阶/" title="Activity的进阶">http://mjjde.github.io/2015/12/28/Activity的进阶/</a></p>
        <footer>
            <a href="http://mjjde.github.io">
                <img src="/images/avatar.jpg" alt="Joker Mei">
                Joker Mei
            </a>
        </footer>
    </div>
</div>

      
    </div>
    <footer class="article-footer">
        
        
<div class="post-share">
    <a href="javascript:;" id="share-sub" class="post-share-fab">
        <i class="fa fa-share-alt"></i>
    </a>
    <div class="post-share-list" id="share-list">
        <ul class="share-icons">
          <li>
            <a class="weibo share-sns" target="_blank" href="http://service.weibo.com/share/share.php?url=http://mjjde.github.io/2015/12/28/Activity的进阶/&title=《Activity的进阶》 — 清风向阳&pic=http://mjjde.github.ioimages/avatar.jpg" data-title="微博">
              <i class="fa fa-weibo"></i>
            </a>
          </li>
          <li>
            <a class="weixin share-sns" id="wxFab" href="javascript:;" data-title="微信">
              <i class="fa fa-weixin"></i>
            </a>
          </li>
          <li>
            <a class="qq share-sns" target="_blank" href="http://connect.qq.com/widget/shareqq/index.html?url=http://mjjde.github.io/2015/12/28/Activity的进阶/&title=《Activity的进阶》 — 清风向阳&source=
Activity的生命周期变化有两种情况，一个是人为，一个是系统干预。" data-title="QQ">
              <i class="fa fa-qq"></i>
            </a>
          </li>
          <li>
            <a class="facebook share-sns" target="_blank" href="https://www.facebook.com/sharer/sharer.php?u=http://mjjde.github.io/2015/12/28/Activity的进阶/" data-title="Facebook">
              <i class="fa fa-facebook"></i>
            </a>
          </li>
          <li>
            <a class="twitter share-sns" target="_blank" href="https://twitter.com/intent/tweet?text=《Activity的进阶》 — 清风向阳&url=http://mjjde.github.io/2015/12/28/Activity的进阶/&via=http://mjjde.github.io" data-title="Twitter">
              <i class="fa fa-twitter"></i>
            </a>
          </li>
          <li>
            <a class="google share-sns" target="_blank" href="https://plus.google.com/share?url=http://mjjde.github.io/2015/12/28/Activity的进阶/" data-title="Google+">
              <i class="fa fa-google-plus"></i>
            </a>
          </li>
        </ul>
     </div>
</div>
<div class="post-modal wx-share" id="wxShare">
    <a class="close" href="javascript:;" id="wxShare-close">×</a>
    <p>扫一扫，分享到微信</p>
    <img src="//api.qrserver.com/v1/create-qr-code/?data=http://mjjde.github.io/2015/12/28/Activity的进阶/" alt="微信分享二维码">
</div>

<div class="mask"></div>

        
        <ul class="article-footer-menu">
            
            
  <li class="article-footer-tags">
    <i class="fa fa-tags"></i>
      
    <a href="/tags/Activity/" class="color4">Activity</a>
      
  </li>

        </ul>
        
    </footer>
  </div>
</article>


    <aside class="post-toc-pos post-toc-top" id="post-toc">
        <nav class="post-toc-wrap">
            <ol class="post-toc"><li class="post-toc-item post-toc-level-4"><a class="post-toc-link" href="#正常Activity生命周期"><span class="post-toc-text">正常Activity生命周期</span></a></li><li class="post-toc-item post-toc-level-4"><a class="post-toc-link" href="#非正常Activity生命周期"><span class="post-toc-text">非正常Activity生命周期</span></a></li><li class="post-toc-item post-toc-level-4"><a class="post-toc-link" href="#Activity的启动模式"><span class="post-toc-text">Activity的启动模式</span></a><ol class="post-toc-child"><li class="post-toc-item post-toc-level-5"><a class="post-toc-link" href="#standard模式"><span class="post-toc-text">standard模式</span></a></li><li class="post-toc-item post-toc-level-5"><a class="post-toc-link" href="#singleTop模式"><span class="post-toc-text">singleTop模式</span></a></li><li class="post-toc-item post-toc-level-5"><a class="post-toc-link" href="#singleTask模式"><span class="post-toc-text">singleTask模式</span></a></li><li class="post-toc-item post-toc-level-5"><a class="post-toc-link" href="#singleInstance模式"><span class="post-toc-text">singleInstance模式</span></a></li></ol></li><li class="post-toc-item post-toc-level-4"><a class="post-toc-link" href="#Activity的Flags"><span class="post-toc-text">Activity的Flags</span></a></li></ol>
        </nav>
    </aside>
    

<nav id="article-nav">
  
    <a href="/2016/01/05/Android-IPC通讯Binder和Service的关系/" id="article-nav-newer" class="article-nav-link-wrap">

      <span class="article-nav-title">
        <i class="fa fa-hand-o-left" aria-hidden="true"></i>
        
          Android-IPC通讯Binder和Service的关系
        
      </span>
    </a>
  
  
    <a href="/2015/12/25/EventBus2-4-0源码分析之Post/" id="article-nav-older" class="article-nav-link-wrap">
      <span class="article-nav-title">EventBus2-4-0源码分析之Post</span>
      <i class="fa fa-hand-o-right" aria-hidden="true"></i>
    </a>
  
</nav>



    
</section>
        
      </div>
      <footer id="footer">
  <div class="outer">
    <div id="footer-info" class="inner">
      
<p>
    <span id="busuanzi_container_site_uv" style='display:none'>
        总访客数：<span id="busuanzi_value_site_uv"></span>
    </span>
    <span id="busuanzi_container_site_pv" style='display:none'>
        总访问量：<span id="busuanzi_value_site_pv"></span>
    </span>
</p>


      <p>
        Powered by  <a href="http://hexo.io/" target="_blank">Hexo</a>
        Theme <a href="//github.com/wongminho/hexo-theme-miho" target="_blank">MiHo</a>
      &copy; 2018 Joker Mei<br>
      </p>
    </div>
  </div>
</footer>
    <script async src="//dn-lbstatics.qbox.me/busuanzi/2.3/busuanzi.pure.mini.js"></script>
<script src="//cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
<script>
  var mihoConfig = {
      root: "http://mjjde.github.io",
      animate: false,
      isHome: false,
      share: true
  }
</script>
<div class="sidebar">
    <!-- <div id="sidebar-search" title="Search">
        <i class="fa fa-search"></i>
    </div> -->
    <div id="sidebar-category" title="Categories">
        <i class="fa fa-book"></i>
    </div>
    <div id="sidebar-tag" title="Tags">
        <i class="fa fa-tags"></i>
    </div>
    <div id="sidebar-top">
        <span class="sidebar-top-icon"><i class="fa fa-angle-up"></i></span>
    </div>
</div>
<div class="sidebar-menu-box" id="sidebar-menu-box">
    <div class="sidebar-menu-box-container">
        <div id="sidebar-menu-box-categories">
            <a class="category-link" href="/categories/Android技术/">Android技术</a><a class="category-link" href="/categories/其他技术/">其他技术</a><a class="category-link" href="/categories/网络技术/">网络技术</a><a class="category-link" href="/categories/设计模式/">设计模式</a>
        </div>
        <div id="sidebar-menu-box-tags">
            <a href="/tags/Activity/" style="font-size: 10px;">Activity</a> <a href="/tags/Android/" style="font-size: 16px;">Android</a> <a href="/tags/Android-IPC/" style="font-size: 10px;">Android-IPC</a> <a href="/tags/Binder/" style="font-size: 16px;">Binder</a> <a href="/tags/DiskLruCache/" style="font-size: 10px;">DiskLruCache</a> <a href="/tags/Fragment/" style="font-size: 10px;">Fragment</a> <a href="/tags/HTTP/" style="font-size: 20px;">HTTP</a> <a href="/tags/Java/" style="font-size: 10px;">Java</a> <a href="/tags/Notification/" style="font-size: 10px;">Notification</a> <a href="/tags/RemoteView/" style="font-size: 10px;">RemoteView</a> <a href="/tags/Rxjava/" style="font-size: 14px;">Rxjava</a> <a href="/tags/ServiceManager/" style="font-size: 14px;">ServiceManager</a> <a href="/tags/android/" style="font-size: 12px;">android</a> <a href="/tags/gradle/" style="font-size: 10px;">gradle</a> <a href="/tags/java/" style="font-size: 18px;">java</a> <a href="/tags/other/" style="font-size: 10px;">other</a> <a href="/tags/volley/" style="font-size: 12px;">volley</a> <a href="/tags/widget/" style="font-size: 10px;">widget</a> <a href="/tags/事件/" style="font-size: 10px;">事件</a> <a href="/tags/组件化/" style="font-size: 10px;">组件化</a> <a href="/tags/设计模式/" style="font-size: 18px;">设计模式</a>
        </div>
    </div>
    <a href="javascript:;" class="sidebar-menu-box-close">&times;</a>
</div>
<div class="mobile-header-menu-nav" id="mobile-header-menu-nav">
    <div id="mobile-header-menu-container">
        <span class="title">Menu</span>
        <ul class="mobile-header-menu-navbar">
            
            <li>
                <a  href="/">
                    <i class="fa fa-home"></i><span>Home</span>
                </a>
            </li>
            
            <li>
                <a  href="/archives">
                    <i class="fa fa-archive"></i><span>Archives</span>
                </a>
            </li>
            
            <li>
                <a  href="/about">
                    <i class="fa fa-user"></i><span>About</span>
                </a>
            </li>
            
        </ul>
    </div>
</div>
<div class="search-wrap">
    <span class="search-close">&times;</span>
        <a href="javascript:;" class="header-icon waves-effect waves-circle waves-light" id="back">
            <i class="icon icon-lg icon-chevron-left"></i>
        </a>
        <input class="search-field" placeholder="Search..." id="keywords">
        <a id="search-submit" href="javascript:;">
            <i class="fa fa-search"></i>
        </a>
    <div class="search-container" id="search-container">
        <ul class="search-result" id="search-result">
        </ul>
    </div>
</div>

<div id="search-tpl">
    <li class="search-result-item">
        <a href="{url}" class="search-item-li">
            <span class="search-item-li-title" title="{title}">{title}</span>
        </a>
    </li>
</div>
<script src="/js/search.js"></script>
<script src="/js/main.js"></script>








  </div>
</body>
</html>